package com.hyperfix.user.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hyperfix.common.auth.RequiresRole;
import com.hyperfix.common.holder.UserHolder;
import com.hyperfix.models.common.R;
import com.hyperfix.models.user.dtos.UserDTO;
import com.hyperfix.models.user.dtos.UserInfoDTO;
import com.hyperfix.models.user.vos.NewUserVO;
import com.hyperfix.models.user.vos.UserInfoQueryVO;
import com.hyperfix.models.user.vos.UserInfoVO;
import com.hyperfix.user.service.UserInfoService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;

/**
 * @author JiangChunYu
 * 2024/4/7
 */
@Validated
@RestController
@RequestMapping("/userInfo")
public class UserInfoController {
    @Resource
    private UserInfoService userInfoService;

    /**
     * 查询个人信息
     *
     * @return {@link R}<{@link UserInfoDTO}> 个人信息
     */
    @PostMapping("/me")
    public R<UserInfoDTO> me() {
        UserDTO userDTO = UserHolder.getUser();
        return userInfoService.getUserInfoByUsername(userDTO.getUsername());
    }

    /**
     * 修改用户信息
     *
     * @param userInfoVO 用户信息 VO
     * @return {@link R}<{@link String}> 是否修改成功
     */
    @RequiresRole("admin")
    @PostMapping("/updateInfo")
    public R<String> updateInfo(@RequestBody @Validated UserInfoVO userInfoVO) {
        return userInfoService.updateInfo(userInfoVO);
    }

    /**
     * 添加用户
     *
     * @param newUserVO 新用户(用户，用户信息)
     * @return {@link R}<{@link String}>
     */
    @RequiresRole("admin")
    @PostMapping("/addUser")
    public R<String> addUser(@RequestBody @Validated NewUserVO newUserVO) {
        return userInfoService.addUser(newUserVO);
    }

    /**
     * 删除用户(同时删除用户关联数据)
     *
     * @param username 用户名
     * @return {@link R}<{@link String}> 是否删除成功
     */
    @RequiresRole("admin")
    @GetMapping("/delete/{username}")
    public R<String> delete(@PathVariable("username") @NotBlank(message = "用户名不能为空") String username) {
        return userInfoService.delete(username);
    }

    /**
     * 查询用户列表
     *
     * @param pageNum         页码
     * @param size            大小
     * @param userInfoQueryVO 用户信息查询 VO
     * @return {@link R}<{@link IPage}<{@link UserInfoDTO}>> 查询结果
     */
    @PostMapping("/list/{pageNum}/{size}")
    public R<IPage<UserInfoDTO>> list(@PathVariable @Min(value = 1, message = "页号最小不能小于1") Integer pageNum,
                                      @PathVariable @Min(value = 1, message = "页大小最小不能小于1") Integer size,
                                      @RequestBody @Validated UserInfoQueryVO userInfoQueryVO) {
        return userInfoService.list(pageNum, size, userInfoQueryVO);
    }
}
